home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 9 / FM Towns Free Software Collection 9.iso / t_os / tool / vdgear / src / gui.c < prev    next >
Text File  |  1994-11-16  |  4KB  |  206 lines

  1. /*
  2.  *    VIDEO・GEAR
  3.  *    "gui.c"
  4.  *    by Good-Chy
  5.  */
  6.  
  7. #include    "video.h"
  8.  
  9. void    setmos(int pat)
  10.     {
  11.     int    i,j;
  12.     unsigned    char    ptn1, ptn2;
  13.  
  14.     MOS_disp(0);
  15.     MOS_typeRom(pat,0,0,mos_pattern);    /* パタ-ンの読み込み */
  16.  
  17.     for (i=2+128 ; i<2+128+128 ; i++)    /* ANDパタ-ン作成 */
  18.         {
  19.         mos_pattern[i+512-128] = mos_pattern[i];
  20.         }
  21.  
  22.     for (i=127 ; i>=0 ; i--)        /* カラ-デ-タ作成 */
  23.         {
  24.         ptn1 = ((unsigned char*)mos_pattern)[i+2];
  25.         for (j=0 ; j<4 ; j++)
  26.             {
  27.             switch((ptn1>>((3-j)*2)) & 0x3)
  28.                 {
  29.                 case    0:    ptn2 = 0x88;    break;
  30.                 case    1:    ptn2 = 0xf8;    break;
  31.                 case    2:    ptn2 = 0x8f;    break;
  32.                 case    3:    ptn2 = 0xff;    break;
  33.                 }
  34.             ((unsigned char*)mos_pattern)[2+i*4+j] = ptn2;
  35.             }
  36.         }
  37.  
  38.     if (pat == 81)    { MOS_type(2, 0, 0,mos_pattern); }
  39.     else            { MOS_type(2,15,15,mos_pattern); }
  40.  
  41.     MOS_disp(1);
  42.     }
  43.  
  44. void    dummy()
  45.     {
  46.     MOS_disp(0);
  47.     MOS_disp(1);
  48.     }
  49.  
  50. void    pro_exit()
  51.     {
  52.     close();
  53.     kana_end();
  54.     MOS_end();
  55.     SND_end();
  56.     exit(0);
  57.     }
  58.  
  59. void    close()
  60.     {
  61.     if (active>0)
  62.         {
  63.         if (key_flag>0)
  64.             {
  65.             key_flag--;
  66.             if (key_flag == 1)
  67.                 {
  68.                 KYB_clrbuf();
  69.                 KAN_disp(KAN_DISPON);
  70.                 }
  71.             if (key_flag == 0)    { key_end(); }
  72.             }
  73.  
  74.         BUTTON    *p, *wp;
  75.         char    *bp;
  76.         int    x1, y1, x2, y2;
  77.  
  78.         bp = win[active].win_buf;
  79.         x1 = win[active].wx;
  80.         y1 = win[active].wy;
  81.         x2 = win[active].dx;
  82.         y2 = win[active].dy;
  83.  
  84.         wp = p = win[active].item;
  85.         while(p != NULL)
  86.             {
  87.             wp = p;
  88.             p = wp->next;
  89.             free(wp);
  90.             }
  91.     
  92.         EGB_writePage(egb_work,0);
  93.         put_vram(bp,x1,y1,x1+x2,y1+y2);
  94.         active--;
  95.         free(bp);
  96.         }
  97.     else                /* 終了 */
  98.         {
  99.         con_win(0);
  100.         }
  101.     }
  102.  
  103. BUTTON    *create(BUTTON *wp, int bx, int by, int dx, int dy,
  104.                 int type, void (*func)())
  105.     {
  106.     BUTTON    *p;
  107.     int    wx,wy;
  108.  
  109.     wx = win[active].wx;
  110.     wy = win[active].wy;
  111.  
  112.     p = (BUTTON *)malloc(sizeof(BUTTON));    /*次の構造体へのポインタ*/
  113.     wp->next = p;                    /*チェイン*/
  114.     (*p).number = wp->number + 1;            /* ボタンの番号 */
  115.     (*wp).bx = wx+bx;                    /* ボタンの座標 */
  116.     (*wp).by = wy+by;
  117.     (*wp).dx = wx+bx+dx;
  118.     (*wp).dy = wy+by+dy;
  119.     (*wp).type = type;                /* ボタンの種類 */
  120.     (*wp).function = func;                /* ボタンの処理プログラム */
  121.  
  122.     if (func == close)
  123.         {
  124.         wp->next = NULL;
  125.         free(p);
  126.         return NULL;
  127.         }
  128.     return p;
  129.     }
  130.  
  131. BUTTON    *window_open(int x1, int y1, int x2, int y2, int tx, int ty)
  132.     {
  133.     BUTTON    *wp;
  134.     char    *bp;
  135.  
  136.     if (key_flag == 2)    { KAN_disp(KAN_DISPOFF); }
  137.  
  138.     active++;
  139.     win[active].wx = x1;
  140.     win[active].wy = y1;
  141.     win[active].dx = x2;
  142.     win[active].dy = y2;
  143.  
  144.     bp = get_vram(16,x1,y1,x1+x2,y1+y2);        /* 画面退避 */
  145.     win[active].win_buf = bp;
  146.  
  147.     EGB_writePage(egb_work,0x80);
  148.     bp = get_vram(16,tx,ty,tx+x2,ty+y2);        /* TIFF読み込み */
  149.     EGB_writePage(egb_work,0);
  150.     put_vram(bp,x1,y1,x1+x2,y1+y2);            /* 表示 */
  151.     free(bp);
  152.  
  153.     wp = (BUTTON *)malloc(sizeof(BUTTON));
  154.     win[active].item = wp;
  155.     (*wp).number = 0;
  156.     return wp;
  157.     }
  158.  
  159. BUTTON    *check_button(int x, int y)
  160.     {
  161.     BUTTON    *p;
  162.     p = win[active].item;
  163.  
  164.     while(p != NULL)
  165.         {
  166.         if ((x>=(p->bx)) && (x<=(p->dx)) && (y>=(p->by)) && (y<=(p->dy)))
  167.             { return p; }
  168.         p = p-> next;
  169.         }
  170.     return    NULL;
  171.     }
  172.  
  173. void    drow(BUTTON *p)
  174.     {
  175.     int    type;
  176.     WORD(para+0) = p->bx;
  177.     WORD(para+2) = p->by;
  178.     WORD(para+4) = p->dx;
  179.     WORD(para+6) = p->dy;
  180.     type = p->type;
  181.  
  182.     EGB_color(egb_work,0,15);            /* 枠の色 */
  183.     EGB_color(egb_work,2,15);            /* 中塗色 */
  184.     EGB_writeMode(egb_work,4);            /* 描写モ-ド XOR */
  185.  
  186.     switch(type)
  187.         {
  188.         case    0:    case    2:
  189.             {
  190.             EGB_paintMode(egb_work,2);    /* 境界ベタ塗り */
  191.             break;
  192.             }
  193.         case    1:
  194.             {
  195.             EGB_paintMode(egb_work,0x22);    /* 境界,面塗り ベタ塗り */
  196.             break;
  197.             }
  198.         }
  199.  
  200.     MOS_disp(0);
  201.     EGB_rectangle(egb_work,para);
  202.     MOS_disp(1);
  203.  
  204.     EGB_writeMode(egb_work,0);
  205.     }
  206.